package com.ia2014.tp.portal2.facades;

import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import com.ia2014.tp.portal2.ejb.AdministradorArticulos;
import com.ia2014.tp.portal2.ejb.AdministradorConfig;
import com.ia2014.tp.portal2.ejb.AdministradorUsuarios;
import com.ia2014.tp.portal2.ejb.AdministradorVentas;
import com.ia2014.tp.portal2.entities.Articulo;
import com.ia2014.tp.portal2.entities.ArticuloElectrodomestico;
import com.ia2014.tp.portal2.entities.ArticuloInfantil;
import com.ia2014.tp.portal2.entities.ArticuloModa;
import com.ia2014.tp.portal2.entities.ArticuloMueble;
import com.ia2014.tp.portal2.entities.Usuario;
import com.ia2014.tp.portal2.integration.converters.Parser;
import com.ia2014.tp.portal2.integration.rest.entities.Ranking;
import com.ia2014.tp.portal2.vo.ArticuloVO;
import com.ia2014.tp.portal2.vo.ItemVentaVO;
import com.ia2014.tp.portal2.vo.UsuarioVO;
import com.ia2014.tp.portal2.vo.VentaVO;

@Stateless
public class FacadeIntegracionBean implements FacadeIntegracion {

	private static Logger logger = Logger.getLogger(FacadeIntegracionBean.class);
	
	@EJB
	private AdministradorArticulos administradorArticulos;
	
	@EJB
	private AdministradorVentas administradorVentas;
	
	@EJB
	private AdministradorUsuarios administradorUsuarios;
	
	@EJB
	private AdministradorConfig administracionConfig;
	
	private Parser parser = new Parser();
	
	
	@Override
	public void agregarNuevoArticulo(String xmlArticulo) {
		// TODO Auto-generated method stub
		
		try{
		
			ArticuloVO articuloVO = parser.parseMensajeNuevoArticulo(xmlArticulo);
				
			Articulo articulo = null;
		
			if(articuloVO == null) {
			
				
				return;
			}
			
			else
	
				if (articuloVO.getArticuloElectrodomesticoVO() != null) {
			
					articulo = new ArticuloElectrodomestico();
			
				} else if (articuloVO.getArticuloModaVO() != null) {
			
					articulo = new ArticuloModa();
			
				}else if (articuloVO.getArticuloMuebleVO() != null) {
			
					articulo = new ArticuloMueble();
			
				}else if (articuloVO.getArticuloInfantilVO() != null) {
			
					articulo = new ArticuloInfantil();
				}
				else {
					
					logger.error("Error. El mensaje no contiene ningun Articulo\n" + "Xml:\n" + xmlArticulo);
					return;
				}
			
			if (articulo != null) {
			
				articulo.setVO(articuloVO);
			
				administradorArticulos.agregarArticulo(articulo);
			}
		}
		catch (Exception e){
			
			logger.error("Error al tratar de agregar Nuevo Articulo\n" + "Xml:\n" + xmlArticulo);
			logger.error(e.toString());
			logger.debug("Stacktrace", e);
						
		}
	}

	@Override
	public List<ArticuloVO> getListaArticulos() {
		return administradorArticulos.getListaArticulos();
	}
	
	@Override
	public ArticuloVO getArticuloByCodigo(Integer codigo) {
		return administradorArticulos.getArticuloByCodigo(codigo);
	}

	@Override
	public ArticuloVO getArticuloById(Integer idArticulo) {
		return administradorArticulos.getArticuloById(idArticulo);
	}

	@Override
	public List<ArticuloVO> getListaArticulosByCategoria(String categoria) {
		return administradorArticulos.getListaArticulosByCategoria(categoria);
	}

	@Override
	public List<ArticuloVO> getListaArticulosByNombre(String nombre) {
		return administradorArticulos.getListaArticulosByNombre(nombre);
	}
	
	@Override
	public void actualizarListaBestSellers(List<Ranking> listaRanking) {
		administradorArticulos.actualizarListaBestSellers(listaRanking);
		
	}
	
	
	 @Override
	public VentaVO getVentaByNro(Integer nroVenta) {
		
		 return administradorVentas.getVentaByNro(nroVenta);
		 
	}

	@Override
	public boolean actualizarEstadoVenta(Integer nroVenta) {
		
		//Actualiza la configuracin del entorno
		this.administracionConfig.actualizarConfiguracion();
		
		return administradorVentas.actualizarEstadoVenta(nroVenta);
		
	}

	@Override
	public List<VentaVO> getListaVentasByUsuario(UsuarioVO usuarioVO) {
		
		try{
			Usuario usuario = new Usuario();
		
			usuario.setVO(usuarioVO);
		
			return administradorVentas.getListaVentasByUsuario(usuario);
		}
		catch(Exception e){
			logger.error("Error al tratar de obtener la ventas del usuario " + usuarioVO.getUserLogin());
			logger.error(e.toString());
			logger.debug("Stacktrace", e);
			return null;
		}
	}

	@Override
	public UsuarioVO loadUsuario(UsuarioVO usuarioVO) {
		return this.administradorUsuarios.loadUsuario(usuarioVO);
	}

	@Override
	public List<ItemVentaVO> getItemsByVenta(Integer nroVenta) {
		return this.administradorVentas.getItemsByVenta(nroVenta);
	}

	@Override
	public List<ArticuloVO> getListaArticulosByFechasDesdeHasta(
			Date fechaDesde, Date fechaHasta) {
		return this.administradorArticulos.getListaArticulosByFecha(fechaDesde, fechaHasta);
	}

	@Override
	public List<ArticuloVO> getListaArticulosByPrecioDesdeHasta(
			Double precioDesde, Double precioHasta) {
		return this.administradorArticulos.getListaArticulosByPrecio(precioDesde, precioHasta);
	}
		

	@Override
	public void actualizarConfiguracion(){
		this.administracionConfig.actualizarConfiguracion();
	}
}
